home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 14.9 KB | 442 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
- * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
- * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
- * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
- * Einverstndnisserklrung des Autors. *
- * *
- * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
- * fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
- * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
- * widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE mtMenus;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 3.00 | 18.01.92 | Hp | *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
-
-
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
- FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE;
- FROM MagicAES IMPORT GBOX, GTEXT, GBOXTEXT, GIBOX, GSTRING, GTITLE,
- Exit, DISABLED, OBJECT, ObjcDraw, ObjcFind,
- BEGMCTRL, ENDMCTRL, WindUpdate, WFFULLXYWH, WindGet,
- FormButton, GrafHandle, MUKEYBD, MUBUTTON, MUM1,
- MUM2, MUMESAG, MUTIMER, EvntMulti, AESIntIn, AESIntOut,
- AESCall;
- FROM mtAppl IMPORT PrivateWS, MouseOn, MouseOff, MouseArrow,
- CharWidth, CharHeight, BoxWidth, BoxHeight;
- FROM mtArea IMPORT AREA, NewAREA, DisposeAREA, FreeArea, SaveArea,
- CopyArea, RestoreArea;
- FROM mtUtils IMPORT tRect, tObjcTree, Bounce, ScanFlags, SearchType,
- CalcArea;
- FROM mtMenubase IMPORT SameLength, DoEvent, ScreenDim, DrawBar, MenuKeyboard,
- PlaceOnScreen;
- FROM MagicStrings IMPORT Assign, Append, Length;
- IMPORT MagicAES, MagicVDI;
-
-
- CONST MaxObjects = 51;
- Links = Bit0;
- Rechts = Bit1;
-
- CONST Enter = 072H;
- Return = 01CH;
- CurUp = 048H;
- CurDown = 050H;
- CurLeft = 04BH;
- CurRight = 04DH;
- Undo = 061H;
-
- TYPE tString = ARRAY [0..40] OF CHAR;
-
-
- TYPE MENUBAR = POINTER TO Menubar;
- Menubar = RECORD
- line: ARRAY [0..255] OF CHAR;
- tree: tObjcTree;
- num: sINTEGER;
- win: sINTEGER;
- sub: sINTEGER;
- start: sINTEGER;
- draw: sINTEGER;
- spos: sINTEGER;
- entry: ARRAY [0..MaxObjects] OF RECORD
- text: ARRAY [0..40] OF CHAR;
- width: sINTEGER;
- pos: sINTEGER;
- END;
- react: RECORD
- x: sINTEGER;
- y: sINTEGER;
- w: sINTEGER;
- h: sINTEGER;
- END;
- END;
-
-
- VAR Dropdown: ARRAY [0..MaxObjects] OF OBJECT;
- menuArea: AREA;
- BAR: MENUBAR;
- b: sBITSET;
- bool, rekExit: BOOLEAN;
- screen: tRect;
- mWidth: sINTEGER;
- mHeight: sINTEGER;
- ScrollStr: ARRAY [0..9] OF CHAR;
- config: Config;
- Char3: sINTEGER;
- Char6: sINTEGER;
- tr: RECORD
- adr: ADDRESS;
- d1, d2: sINTEGER;
- END;
-
-
- PROCEDURE GetMenu (mx, my: sINTEGER): sINTEGER;
- VAR j: sINTEGER;
- BEGIN
- WITH BAR^ DO
- WITH react DO
- IF (my > y) AND (my < (y + h)) THEN
- IF (mx > x) AND (mx < (x + 3 * CharWidth)) THEN RETURN -2; END;
- IF (mx > (x + Char3) - 1) AND (mx < (x + Char6)) THEN RETURN -3; END;
- FOR j:= start TO draw DO
- IF (mx >= (x + entry[j].pos)) AND
- (mx <= (x + entry[j].pos + entry[j].width)) THEN
- RETURN j;
- END;
- END;
- END;
- END;
- END;
- RETURN -1;
- END GetMenu;
-
-
- PROCEDURE DoMenu (t: tObjcTree; VAR j: sINTEGER): sINTEGER;
- VAR mx, my, ox, oy, i, jj, o: sINTEGER;
- ob, oldob, taste, scan, clicks: sINTEGER;
- button, kbshift, event: sBITSET;
- ascii: CHAR;
- steigaus: BOOLEAN;
-
- PROCEDURE DoDraw (ob: sINTEGER);
- BEGIN
- IF ob > 0 THEN MouseOff; DrawBar (t, ob); MouseOn; END;
- END DoDraw;
-
- BEGIN
- oldob:= -1; ob:= -1; ox:= -1; oy:= -1;
- LOOP
- event:= DoEvent (mx, my, button, scan);
-
- (* Teste ob anderes Men selektiert *)
- IF config # pull THEN
- jj:= GetMenu (mx, my);
- CASE jj OF
- -3: DoDraw (ob); j:= -3; RETURN -1;|
- -2: DoDraw (ob); j:= -2; RETURN -1;|
- -1: | (* Nix tun *)
- ELSE IF (jj # j) THEN DoDraw (ob); j:= jj; RETURN -1; END;
- END; (* CASE *)
- END; (* config # pull *)
-
- (* Teste welches Objekt selektiert *)
- IF (mx # ox) OR (my # oy) THEN
- ox:= mx; oy:= my; ob:= MagicAES.ObjcFind (t, 0, MaxObjects, mx, my);
- IF (ob # oldob) AND (ob > 0) THEN
- DoDraw (oldob); DoDraw (ob); oldob:= ob;
- ELSIF (ob < 0) AND (oldob > 0) THEN
- DoDraw (oldob); oldob:= -1;
- END;
- END;
-
- IF (config = pull) THEN
- steigaus:= FALSE;
- LOOP
- MagicAES.GrafMkstate (mx, my, button, kbshift);
- o:= MagicAES.ObjcFind (t, 0, MaxObjects, mx, my);
- IF o # ob THEN EXIT; END;
- IF NOT (Links IN button) THEN steigaus:= TRUE; EXIT; END;
- END;
- IF steigaus THEN EXIT; END;
- ELSIF (MUKEYBD IN event) THEN
- IF MenuKeyboard (t, scan, 1, oldob, ob) THEN EXIT; END;
- IF ob # oldob THEN DoDraw (oldob); DoDraw (ob); oldob:= ob; END;
- ELSIF (MUBUTTON IN event) THEN
- EXIT;
- END; (* IF (MUKEYBD IN event) *)
- END; (* LOOP *)
- IF ob > 0 THEN
- IF DISABLED IN t^[ob].obState THEN RETURN -1; ELSE RETURN ob; END;
- ELSE
- RETURN -1;
- END;
- END DoMenu;
-
-
- PROCEDURE MakeMenu (subnum: sINTEGER): sINTEGER;
- VAR maxW, maxH, n, i, j, ob, offset: sINTEGER;
- BEGIN
- j:= 0; n:= 1; maxW:= 0; maxH:= 0;
- (*-- Basisobjekt --*)
- Dropdown[0].obNext:= -1;
- Dropdown[0].obHead:= -1;
- Dropdown[0].obTail:= -1;
- Dropdown[0].obType:= GBOX;
- Dropdown[0].obFlags:= {};
- Dropdown[0].obState:= {};
- Dropdown[0].obSpec.Box.char:= 0C;
- Dropdown[0].obSpec.Box.frame:= 377C;
- Dropdown[0].obSpec.Box.flags:= {Bit12, Bit11};
- Dropdown[0].obX:= 0;
- Dropdown[0].obY:= 0;
- Dropdown[0].obWidth:= 0;
- Dropdown[0].obHeight:= 0;
- ob:= BAR^.sub + 1;
- FOR j:= 1 TO subnum DO ob:= BAR^.tree^[ob].obNext; END;
- IF ob < BAR^.sub THEN RETURN -1; END;
- offset:= ob - 1;
- j:= BAR^.tree^[ob].obHead;
- (*-- Objekte addieren --*)
- LOOP
- i:= ScanFlags (BAR^.tree, SearchType, j, GSTRING);
- IF BAR^.tree^[i].obWidth > maxW THEN maxW:= BAR^.tree^[i].obWidth; END;
- Dropdown[n].obNext:= -1;
- Dropdown[n].obHead:= -1;
- Dropdown[n].obTail:= -1;
- Dropdown[n].obType:= BAR^.tree^[i].obType;
- Dropdown[n].obFlags:= BAR^.tree^[i].obFlags;
- Dropdown[n].obState:= BAR^.tree^[i].obState;
- Dropdown[n].obSpec.StringPtr:= BAR^.tree^[i].obSpec.StringPtr;
- Dropdown[n].obX:= 0;
- Dropdown[n].obY:= maxH;
- Dropdown[n].obWidth:= BAR^.tree^[i].obWidth;
- Dropdown[n].obHeight:= CharHeight;
- MagicAES.ObjcAdd (ADR(Dropdown), 0, n);
- INC (n); INC (maxH, CharHeight); j:= i + 1;
- IF i = BAR^.tree^[ob].obTail THEN EXIT; END;
- END;
- FOR i:= 0 TO n - 1 DO Dropdown[i].obWidth:= maxW; END;
- Dropdown[0].obHeight:= maxH;
- RETURN offset;
- END MakeMenu;
-
-
- PROCEDURE NewMenu (menu: ADDRESS; VAR bar: MENUBAR): BOOLEAN;
- VAR i, d: sINTEGER;
- BEGIN
- ALLOCATE (bar, TSIZE (Menubar));
- IF bar = NIL THEN RETURN FALSE; END;
- WITH bar^ DO
- spos:= 6 * CharWidth; i:= 3; num:= 0; tree:= menu;
- LOOP
- Assign (tree^[i].obSpec.StringPtr^, entry[num].text);
- d:= Length (tree^[i].obSpec.StringPtr^);
- entry[num].width:= d * CharWidth;
- entry[num].pos:= 0;
- IF i = tree^[2].obTail THEN EXIT; END;
- INC (i); INC (num);
- END;
- sub:= i + 1;
- start:= 0;
- END;
- RETURN TRUE;
- END NewMenu;
-
-
- PROCEDURE FreeMenu (VAR bar: MENUBAR);
- BEGIN
- IF BAR = bar THEN BAR:= NIL; END;
- DEALLOCATE (bar, 0); bar:= NIL;
- END FreeMenu;
-
-
- PROCEDURE DrawMenu (bar: MENUBAR; window: sINTEGER; VAR rect: ARRAY OF LOC);
- VAR i, l: sINTEGER;
- r: tRect;
- pr: POINTER TO tRect;
- BEGIN
- IF bar # NIL THEN
- pr:= ADR (rect);
- MagicAES.WindGet (window, MagicAES.WFWORKXYWH, r);
- mWidth:= r.x + r.w; mHeight:= r.y + r.h;
- (* Reaktions-Rechteck berechnen *)
- WITH bar^ DO
- win:= window;
- react.x:= r.x; react.y:= r.y - BoxHeight;
- react.w:= r.w; react.h:= BoxHeight;
- pr^.x:= react.x; pr^.y:= react.y; pr^.w:= react.w; pr^.h:= react.h;
- l:= spos; i:= start; Assign(ScrollStr, line);
- WHILE (i <= num) AND ((l + entry[i].width) < (r.w - BoxWidth)) DO
- Append (entry[i].text, line);
- entry[i].pos:= l; INC (l, entry[i].width); INC (i);
- END;
- draw:= i - 1; tr.adr:= ADR(line); tr.d1:= 0; tr.d2:= 0;
- MagicAES.WindSet (window, MagicAES.WFINFO, tr);
- END;
- MagicAES.WindGet (0, MagicAES.WFTOP, r);
- IF r.x = window THEN BAR:= bar; END;
- END;
- END DrawMenu;
-
-
- PROCEDURE HandleMenu (VAR menu, eintrag: sINTEGER);
- CONST Links = Bit0;
- TYPE tScrol = (links, rechts);
- VAR i, j, mx, my, scan, off, drp: sINTEGER;
- scrol: tScrol;
- b, sr: tRect;
- button, s: sBITSET;
- newmen: BOOLEAN;
-
- PROCEDURE InvertMenu;
- BEGIN
- MouseOff; MagicVDI.FillRectangle (PrivateWS, b); MouseOn;
- END InvertMenu;
-
- PROCEDURE ScrollMenu (dir: sINTEGER);
- VAR i, l: sINTEGER;
- do: BOOLEAN;
- BEGIN
- WITH BAR^ DO
- do:= FALSE;
- IF (dir = -3) AND (num > (start)) THEN INC (start); do:= TRUE; END;
- IF (dir = -2) AND (start > 0) THEN DEC (start); do:= TRUE; END;
- IF do THEN
- Assign (ScrollStr, line); l:= spos; i:= start;
- WHILE (i <= num) AND ((l + entry[i].width) < (react.w - BoxWidth)) DO
- Append (entry[i].text, line);
- entry[i].pos:= l; INC (l, entry[i].width); INC (i);
- END;
- draw:= i - 1; tr.adr:= ADR(line); tr.d1:= 0; tr.d2:= 0;
- MagicAES.WindSet (win, MagicAES.WFINFO, tr);
- Bounce;
- END;
- END;
- END ScrollMenu;
-
- BEGIN
- menu:= -1; eintrag:= -1;
- IF BAR # NIL THEN
- WITH BAR^ DO
- ScreenDim (mWidth, mHeight);
- i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.XOR);
- i:= MagicVDI.SetFillcolor (PrivateWS, 1);
- bool:= MagicVDI.SetFillperimeter (PrivateWS, FALSE);
- IF config = pull THEN WindUpdate (BEGMCTRL); END;
- LOOP
- MagicAES.GrafMkstate (mx, my, button, s);
- j:= GetMenu (mx, my);
- CASE j OF
- -1: i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.REPLACE);
- IF config = pull THEN WindUpdate (ENDMCTRL); END;
- RETURN;|
- -2, -3: IF Links IN button THEN ScrollMenu (j); END;|
- ELSE IF Links IN button THEN EXIT; END;
- END;
- IF config = drop THEN EXIT; END;
- END;
- IF config # pull THEN WindUpdate (BEGMCTRL); END;
- IF j >= 0 THEN
- LOOP
- drp:= j;
- WITH entry[j] DO
- b.x:= react.x + pos; b.y:= react.y + 1;
- b.w:= b.x + width; b.h:= react.y + BoxHeight - 2;
- IF b.w > mWidth THEN b.w:= mWidth - 1; END;
- IF b.h > mHeight THEN b.h:= mHeight - 1; END;
- InvertMenu;
- off:= MakeMenu (j) + 1;
- WITH Dropdown[0] DO
- obX:= react.x + pos; obY:= react.y + BoxHeight;
- IF (obX + obWidth) > mWidth THEN obX:= mWidth - obWidth; END;
- IF (obY + obHeight) > mHeight THEN obY:= react.y - obHeight; END;
- sr.x:= obX - 1; sr.y:= obY - 1; sr.w:= obWidth + 2; sr.h:= obHeight + 2;
- END;
- bool:= SaveArea (PrivateWS, menuArea, sr);
- ObjcDraw (ADR (Dropdown), 0, MaxObjects, sr);
- IF config = click THEN Bounce; END;
- eintrag:= DoMenu (ADR (Dropdown), j);
- IF eintrag > 0 THEN menu:= j + 3; INC (eintrag, off); END;
- RestoreArea (PrivateWS, menuArea);
- IF (config # pull) AND (eintrag > 0) THEN Bounce; END;
- InvertMenu;
- FreeArea (menuArea);
- END; (* WITH entry[j] *)
- IF (j < -1) OR (j = drp) (*OR (config = pull)*) THEN EXIT; END;
- END; (* LOOP *)
- END; (* IF j > 0 *)
- END; (* WITH BAR^ *)
- WindUpdate (ENDMCTRL);
- i:= MagicVDI.SetWritemode (PrivateWS, MagicVDI.REPLACE);
- END; (* IF BAR *)
- END HandleMenu;
-
- PROCEDURE ConfigMenu (conf: Config);
- BEGIN
- config:= conf;
- END ConfigMenu;
-
- BEGIN
- bool:= NewAREA (menuArea);
- BAR:= NIL;
- ScrollStr[0]:= ' ';
- ScrollStr[1]:= 4C;
- ScrollStr[2]:= ' ';
- ScrollStr[3]:= ' ';
- ScrollStr[4]:= 3C;
- ScrollStr[5]:= ' ';
- ScrollStr[6]:= 0C;
- config:= click;
- Char3:= 3 * CharWidth;
- Char6:= 6 * CharWidth;
- END mtMenus.
-
-